﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.Security;

public partial class Login : System.Web.UI.Page
{
    /// <summary>
    ///     <para>
    ///         Se proveruva ulogata na korisnikot:        
    ///     </para>
    ///     <list>  
    ///             <entry> 1 - Student</entry>  
    ///             <entry> 2 - Profesor</entry>
    ///     </list>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnNajava_Click(object sender, EventArgs e)
    {
        CheckBox op = new CheckBox();
        if (checkLogin(txtIme.Text, txtLoz.Text))
        {
            FormsAuthentication.SetAuthCookie(this.txtIme.Text.Trim(), false);

            //Promenliva vo koja ke se smesti adresata za prenasocuvanje
            String adresa;

            //Se smestuva vrednosta za ulogata na korisnikot koj pristapuva do stranata.
            int role = checkRole(txtIme.Text);

            if (Request.QueryString["adresa"] == null)
            {
                //Korisnikot ne e prenasocen, odnosno ne postoi vrednost za zapisot adresa vo query stringot.
                //Dokolku vrednosta na promenlivata role e 1, korisnikot e student i se prenasocuva
                //kon studentskata verzija na stranata Doma.aspx
                if (role == 1)
                {
                    Session["korisnicko"] = txtIme.Text;
                    adresa = "Doma.aspx";
                }

                //Dokolku vrednosta na promenlivata e 2, korisnikot e profesor/asistent i se prenasocuva kon nastavnata
                //verzija na stranata Doma.aspx
                else if (role == 2)
                {
                    Session["korisnicko"] = txtIme.Text;
                    adresa = "p_Doma.aspx";
                }

                //Dokolku korisnikot ne postoi, ne mu se dava dozvola da se logira.
                else
                    adresa = "Login.aspx";
            }

            //Postoi vrednost za zapisot adresa vo query stringot, korisnikot se preprakja kon taa adresa.
            else
            {
                adresa = Request.QueryString["adresa"];
            }

            //Redirektiranje na korisnikot kon prethodno postavenata adresa
            Response.Redirect(adresa);
        }
    }

    /// <summary>
    ///     <para>
    ///         Funkcija koja proveruva dali prethodno vnesenite podatoci
    ///         za korisnicko ime i lozinka odgovaraat so soodveten par vo bazata
    ///     </para>
    /// </summary>
    /// <param name="userName">Korisnicko ime so koe se pristapuva</param>
    /// <param name="userPass">Lozinka koja se proveruva zaedno so korisnickoto ime</param>
    /// <returns>True/False vrednost, vo zavisnost od vnesenite informacii</returns>
    protected bool checkLogin(string userName, string userPass)
    {
        //Promenlivata koja se vrakja kako rezultat na ovaa funkcija
        bool postoi = false;

        //Kreiranje na konekcija so bazata na podatoci
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;

        //Se proveruva koja uloga ja ima korisnikot vo databazata na portalot
        int role = checkRole(userName);

        //Komanda koja go naoga imeto prezimeto i indeksot spored korisnickoto ime
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;

        //SQL query za student
        if (role == 1)
            komanda.CommandText = "SELECT ko.Ime, ko.Prezime, st.Indeks, ko.Lozinka FROM Korisnici AS ko, Student AS st WHERE ko.KorIme=st.s_KorIme AND ko.KorIme='" + userName + "' AND ko.Lozinka='" + userPass + "'";

        //SQL query za profesor
        else if (role == 2)
            komanda.CommandText = "SELECT ko.Ime, ko.Lozinka, ko.Prezime FROM Korisnici AS ko, Profesori AS p WHERE ko.KorIme=p.a_KorIme AND ko.KorIme='" + userName + "' AND ko.Lozinka='" + userPass + "'";
        try
        {
            konekcija.Open();
            SqlDataReader citac = komanda.ExecuteReader();

            //Se ispolnuva dokolku e najdena kombinacija na korisnicko ime i lozinka
            //koja odgovara na vnesenite.
            if (citac.Read())
            {
                //Vnesuvanje vo sesiski promenlivi na imeto, prezimeto i indeksot
                Session["ime"] = citac["Ime"].ToString();
                Session["prezime"] = citac["Prezime"].ToString();
                Session["lozz"] = citac["Lozinka"].ToString();
                if (role == 1)
                    Session["indeks"] = citac["Indeks"].ToString();
                citac.Close();
                postoi = true;
            }

            //SQL query-to ne vratilo niedna redica koja odgovara na vneseniot par korisnicko ime, lozinka.
            else
            {
                postoi = false;
                lblPoraka.Text = "Грешка во најава. Погрешно корисничко име или лозинка";
            }
        }
        catch (Exception er) { lblPoraka.Text = er + "Грешка во најава. Погрешно корисничко име или лозинка"; }
        finally
        {
            //Zatvoranje na konekcijata do bazata
            konekcija.Close();
        }

        //Vrakjanje na finalnata vrednost na boolean promenlivata.
        return postoi;
    }

    /// <summary>
    ///     <para>
    ///         Funkcija koja proveruva od koj tip e korisnikot koj pristapuva
    ///     </para>
    /// </summary>
    /// <param name="userName">Korisnicko ime so koe se pristapuva</param>
    /// <returns>Celobrojna reprezentacija na tipot na korisnik: 1 - Student, 2 - Profesor</returns>
    protected int checkRole(string userName)
    {
        //Promenlivata koja se vrakja kako rezultat na ovaa funkcija
        int role = 0;

        //Se kreira konekcija i konekciskata vrska
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;

        //Kreiranje na komanda koja go naoga tipot na korisnikot spored korisnickoto ime
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;
        komanda.CommandText = "SELECT k.Tip FROM Korisnici AS k, Profesori AS p, Student AS s WHERE k.KorIme ='" + userName + "'";

        try
        {
            konekcija.Open();
            SqlDataReader citac = komanda.ExecuteReader();

            //Se ispolnuva dokolku e najdeno korisnicko ime
            //koe odgovara na vnesenoto.
            if (citac.Read())
            {   
                //Postavuvanje na vrednosta na tipot na korisnikot
                role = Int16.Parse(citac["Tip"].ToString());
            }

            //SQL query-to ne vratilo niedna redica koja odgovara na vneseniot par korisnicko ime, lozinka.
            else
                lblPoraka.Text ="Грешка во најава. Погрешно корисничко име или лозинка";
        }
        catch (Exception er) { lblPoraka.Text = er + "Грешка во најава. Погрешно корисничко име или лозинка"; }
        finally
        {   
            //Postavuvanje na tipot na korisnikot vo sesiska promenliva za ponatamosno koristenje niz portalot
            Session["tip"] = role;

            //Zatvoranje na konekcijata do bazata
            konekcija.Close();
        }
        return role;
    }
}

